home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / util / gnu / xpdf-0.8-src.lha / xpdf-0.8-src / ltk / LTKBorder.cc < prev    next >
C/C++ Source or Header  |  1998-11-28  |  7KB  |  217 lines

  1. //========================================================================
  2. //
  3. // LTKBorder.cc
  4. //
  5. // Copyright 1996 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. #pragma implementation
  11. #endif
  12.  
  13. #include <stddef.h>
  14. #include "gtypes.h"
  15. #include "LTKBorder.h"
  16.  
  17. Gulong ltkGetBrightColor(Display *display, int screenNum,
  18.              XColor *bg, Gulong def) {
  19.   XColor bright;
  20.   Gulong ret;
  21.   Gulong t;
  22.  
  23.   if ((bg->red == 0 && bg->green == 0 && bg->blue == 0) ||
  24.       (bg->red == 65535 && bg->green == 65535 && bg->blue == 65535)) {
  25.     ret = def;
  26.   } else {
  27.     t = (Gulong)bg->red + (Gulong)bg->red / 4;
  28.     bright.red = (t > 65535) ? 65535 : (Gushort)t;
  29.     t = (Gulong)bg->green + (Gulong)bg->green / 4;
  30.     bright.green = (t > 65535) ? 65535 : (Gushort)t;
  31.     t = (Gulong)bg->blue + (Gulong)bg->blue / 4;
  32.     bright.blue = (t > 65535) ? 65535 : (Gushort)t;
  33.     if (XAllocColor(display, DefaultColormap(display, screenNum), &bright))
  34.       ret = bright.pixel;
  35.     else
  36.       ret = def;
  37.   }
  38.   return ret;
  39. }
  40.  
  41. Gulong ltkGetDarkColor(Display *display, int screenNum,
  42.                XColor *bg, Gulong def) {
  43.   XColor dark;
  44.   Gulong ret;
  45.   long t;
  46.  
  47.   if ((bg->red == 0 && bg->green == 0 && bg->blue == 0) ||
  48.       (bg->red == 65535 && bg->green == 65535 && bg->blue == 65535)) {
  49.     ret = def;
  50.   } else {
  51.     t = (Gulong)bg->red - (Gulong)bg->red / 4;
  52.     dark.red = (t < 0) ? 0 : (Gushort)t;
  53.     t = (Gulong)bg->green - (Gulong)bg->green / 4;
  54.     dark.green = (t < 0) ? 0 : (Gushort)t;
  55.     t = (Gulong)bg->blue - (Gulong)bg->blue / 4;
  56.     dark.blue = (t < 0) ? 0 : (Gushort)t;
  57.     if (XAllocColor(display, DefaultColormap(display, screenNum), &dark))
  58.       ret = dark.pixel;
  59.     else
  60.       ret = def;
  61.   }
  62.   return ret;
  63. }
  64.  
  65. void ltkDrawBorder(Display *display, Window xwin,
  66.            GC bright, GC dark, GC background,
  67.            int x, int y, int width, int height,
  68.            LTKBorder border) {
  69.   GC gc1 = None;
  70.   GC gc2 = None;
  71.  
  72.   switch (border) {
  73.   case ltkBorderNone:
  74.     gc1 = gc2 = background;
  75.     break;
  76.   case ltkBorderRaised:
  77.     gc1 = bright;
  78.     gc2 = dark;
  79.     break;
  80.   case ltkBorderSunken:
  81.     gc1 = dark;
  82.     gc2 = bright;
  83.     break;
  84.   }
  85.   XDrawLine(display, xwin, gc1, x, y, x+width-1, y);
  86.   XDrawLine(display, xwin, gc1, x+1, y+1, x+width-2, y+1);
  87.   XDrawLine(display, xwin, gc1, x, y, x, y+height-1);
  88.   XDrawLine(display, xwin, gc1, x+1, y+1, x+1, y+height-2);
  89.   XDrawLine(display, xwin, gc2, x, y+height-1, x+width-1, y+height-1);
  90.   XDrawLine(display, xwin, gc2, x+1, y+height-2, x+width-2, y+height-2);
  91.   XDrawLine(display, xwin, gc2, x+width-1, y, x+width-1, y+height-1);
  92.   XDrawLine(display, xwin, gc2, x+width-2, y+1, x+width-2, y+height-2);
  93. }
  94.  
  95. void ltkDrawTriBorder(Display *display, Window xwin,
  96.               GC bright, GC dark, GC background,
  97.               int x, int y, int width, int height,
  98.               LTKTriangle orient, LTKBorder border) {
  99.   GC gc1 = None;
  100.   GC gc2 = None;
  101.   int x2, y2;
  102.  
  103.   switch (border) {
  104.   case ltkBorderNone:
  105.     gc1 = gc2 = background;
  106.     break;
  107.   case ltkBorderRaised:
  108.     gc1 = bright;
  109.     gc2 = dark;
  110.     break;
  111.   case ltkBorderSunken:
  112.     gc1 = dark;
  113.     gc2 = bright;
  114.     break;
  115.   }
  116.   switch (orient) {
  117.   case ltkTriLeft:
  118.     y2 = y + (height - 1) / 2;
  119.     XDrawLine(display, xwin, gc1, x+width-1, y, x, y2);
  120.     XDrawLine(display, xwin, gc1, x+width-2, y+1, x+1, y2);
  121.     XDrawLine(display, xwin, gc2, x, y2, x+width-1, y+height-1);
  122.     XDrawLine(display, xwin, gc2, x+1, y2, x+width-2, y+height-2);
  123.     XDrawLine(display, xwin, gc2, x+width-1, y+height-1, x+width-1, y);
  124.     XDrawLine(display, xwin, gc2, x+width-2, y+height-2, x+width-2, y+1);
  125.     break;
  126.   case ltkTriRight:
  127.     y2 = y + (height - 1) / 2;
  128.     XDrawLine(display, xwin, gc1, x+width-1, y2, x, y);
  129.     XDrawLine(display, xwin, gc1, x+width-2, y2, x+1, y+1);
  130.     XDrawLine(display, xwin, gc1, x, y, x, y+height-1);
  131.     XDrawLine(display, xwin, gc1, x+1, y+1, x+1, y+height-2);
  132.     XDrawLine(display, xwin, gc2, x, y+height-1, x+width-1, y2);
  133.     XDrawLine(display, xwin, gc2, x+1, y+height-2, x+width-2, y2);
  134.     break;
  135.   case ltkTriUp:
  136.     x2 = x + (width - 1) / 2;
  137.     XDrawLine(display, xwin, gc1, x2, y, x, y+height-1);
  138.     XDrawLine(display, xwin, gc1, x2, y+1, x+1, y+height-2);
  139.     XDrawLine(display, xwin, gc2, x, y+height-1, x+width-1, y+height-1);
  140.     XDrawLine(display, xwin, gc2, x+1, y+height-2, x+width-2, y+height-2);
  141.     XDrawLine(display, xwin, gc2, x+width-1, y+height-1, x2, y);
  142.     XDrawLine(display, xwin, gc2, x+width-2, y+height-2, x2, y+1);
  143.     break;
  144.   case ltkTriDown:
  145.     x2 = x + (width - 1) / 2;
  146.     XDrawLine(display, xwin, gc1, x+width-1, y, x, y);
  147.     XDrawLine(display, xwin, gc1, x+width-2, y+1, x+1, y+1);
  148.     XDrawLine(display, xwin, gc1, x, y, x2, y+height-1);
  149.     XDrawLine(display, xwin, gc1, x+1, y+1, x2, y+height-2);
  150.     XDrawLine(display, xwin, gc2, x2, y+height-1, x+width-1, y);
  151.     XDrawLine(display, xwin, gc2, x2, y+height-2, x+width-2, y+1);
  152.     break;
  153.   }
  154. }
  155.  
  156. void ltkDrawDivider(Display *display, Window xwin,
  157.             GC bright, GC dark, GC background,
  158.             int x, int y, int width, int height,
  159.             LTKBorder border) {
  160.   GC gc1 = None;
  161.   GC gc2 = None;
  162.  
  163.   switch (border) {
  164.   case ltkBorderNone:
  165.     gc1 = gc2 = background;
  166.     break;
  167.   case ltkBorderRaised:
  168.     gc1 = bright;
  169.     gc2 = dark;
  170.     break;
  171.   case ltkBorderSunken:
  172.     gc1 = dark;
  173.     gc2 = bright;
  174.     break;
  175.   }
  176.   if (width > 0) {
  177.     XDrawLine(display, xwin, gc1, x, y, x+width-1, y);
  178.     XDrawLine(display, xwin, gc2, x, y+1, x+width-1, y+1);
  179.   } else {
  180.     XDrawLine(display, xwin, gc1, x, y, x, y+height-1);
  181.     XDrawLine(display, xwin, gc2, x+1, y, x+1, y+height-1);
  182.   }
  183. }
  184.  
  185. void ltkDrawSplitBorder(Display *display, Window xwin,
  186.             GC bright, GC dark, GC background,
  187.             int x, int y, int width, int height,
  188.             LTKBorder border) {
  189.   GC gc1 = None;
  190.   GC gc2 = None;
  191.  
  192.   switch (border) {
  193.   case ltkBorderNone:
  194.     gc1 = gc2 = background;
  195.     break;
  196.   case ltkBorderRaised:
  197.     gc1 = bright;
  198.     gc2 = dark;
  199.     break;
  200.   case ltkBorderSunken:
  201.     gc1 = dark;
  202.     gc2 = bright;
  203.     break;
  204.   }
  205.   if (width > 0) {
  206.     XDrawLine(display, xwin, gc1, x+1, y,   x+width-2, y);
  207.     XDrawLine(display, xwin, gc1, x,   y+1, x+width-1, y+1);
  208.     XDrawLine(display, xwin, gc2, x,   y+2, x+width-1, y+2);
  209.     XDrawLine(display, xwin, gc2, x+1, y+3, x+width-2, y+3);
  210.   } else {
  211.     XDrawLine(display, xwin, gc1, x,   y+1, x,   y+height-2);
  212.     XDrawLine(display, xwin, gc1, x+1, y,   x+1, y+height-1);
  213.     XDrawLine(display, xwin, gc2, x+2, y,   x+2, y+height-1);
  214.     XDrawLine(display, xwin, gc2, x+3, y+1, x+3, y+height-2);
  215.   }
  216. }
  217.